/**
 * Created by json on 2016/8/30.
 */

//HTTP协议
dwc.GX_NetWorkManager = {
    m_arrNetWorkListener : [],//私有监听器数组
    m_webSocket : null,//webSocket对象
    m_iMaxSendTimes : 5,//最大发送次数
    m_iCurrentSendTimes : 0, //记录当前发送次数

    //http协议 参数[__str:发送的内容, __async: 异步,__callback:回调函数]
    _sendMessageByXML : function(__url, __callback,_param){
        var self = this;

        /////////////////////////////////////////////
        //1.XMLHTTPRequest初始化
        var xhr = cc.loader.getXMLHttpRequest();
        //打开 //http://192.168.2.8:8080/paygate/index.php
        xhr.open("GET", __url, true);
        //超时时间5s
        xhr.timeout = 5000;
        //设置文本内容类型
        xhr.setRequestHeader("Content-Type","text/plain;charset=UTF-8");//简单文本内容
        /////////////////////////////////////////////
        //2.XMLHTTPREquest响应回调函数
        //超时重发协议
        xhr.ontimeout = function(){
            if(self.m_iCurrentSendTimes > self.m_iMaxSendTimes)
            {
                //网络出现问题
                //cc.eventManager.dispatchCustomEvent(dwc.GX_MY_EVENT.NETWORK_CONNECT_TIMEOUT, "网络连接超时...");

                //重置当前发送次数
                self.m_iCurrentSendTimes = 0;
            }
            else
            {
                self.m_iCurrentSendTimes += 1;
                //从新发送信息
                self._sendMessageByXML(__url, __callback,_param);
            }
        };

        //错误提示-->发送事件
        xhr.onerror = function(){
            //cc.eventManager.dispatchCustomEvent(dwc.GX_MY_EVENT.NETWORK_CONNECT_ERROR, "网络连接错误!请检查您的网络.");
        };

        //特殊的事件
        xhr.onreadystatechange = function () {
            if (xhr.readyState == 4
                && (xhr.status >= 200
                && xhr.status <= 207)) {
                //var httpStatus = xhr.statusText;
                var response = xhr.responseText;

                cc.log("响应:"+response);

                //将接收到的数据解析成JSON格式
                //var msg = JSON.parse(response);

                //如果传入了回调,则使用此回调
                if(__callback){
                    __callback && __callback.call(this, response,_param);
                    return;
                }


            }else{
                cc.assert("错误的响应!readyStat:" + xhr.readyState + ",status:" + xhr.status);
            }
        };

        /////////////////////////////////////////////
        //3.使用xmlHttpRequest发送消息
        xhr.send();
    },

    //**********************以下是公共方法****************************//
    //发送消息 参数:cmd,协议号,object对象,回调函数
    SendMessage : function(__url,__callback,_param){

        this._sendMessageByXML(__url,__callback,_param);
    },

    //添加监听器到本地
    AddListener : function(__target, __callback){
        //检验参数个数
        var argLength = arguments.length;
        if(argLength == 2){
            //判断参数
            if((typeof __target != "object") || (typeof __callback != "function")){
                cc.assert("GX_NewWorkManager.AddListener : 参数错误!");
                return;
            }
        }else{
            cc.assert("GX_NetWorkManager.AddListener:参数个数错误!");
            return;
        }

        //如果存在,则重置回调
        for(var i = 0; i < this.m_arrNetWorkListener.length; i++){
            var listener = this.m_arrNetWorkListener[i];
            if(listener
                && listener._target === __target)
            {
                listener._callback = __callback;
                return;
            }
        }

        //不存在,加入队列中
        var listener = {
            _target : __target,
            _callback : __callback
        };
        this.m_arrNetWorkListener.push(listener);

    },

    //移除指定监听器
    RemoveListener : function(__target){
        this.FindAndRemoveListener(__target);
    },

    //查找指定对象监听器并移除
    FindAndRemoveListener : function(__target){
        for(var i = 0; i < this.m_arrNetWorkListener.length; i++){
            var listener = this.m_arrNetWorkListener[i];
            if(listener
                && listener._target === __target)
            {
                this.m_arrNetWorkListener.splice(i, 1);
                return;
            }
        }
    },

    //分发消息
    OnMessage : function(__msg,_param){
        //遍历数组,给所有添加监听的函数分发数据
        for(var i = 0; i < this.m_arrNetWorkListener.length; i++)
        {
            var listener = this.m_arrNetWorkListener[i];
            if(listener && listener._target)
            {
                listener._callback.call(listener._target, __msg);
            }
        }
    }
};

